<html>
    <head>
        <title>配置 Configuration</title>
    </head>
    <body>
        <script>
               /*
                          六、配置  配置生成静态代理  Configuration


                                    1、AbpRemoteServiceOptions 选项类

                                                AbpRemoteServiceOptions默认情况下从appsettings.json自动设置。

                                                或者，您可以在模块的ConfigureServices方法中配置它以设置或覆盖它。

                                                eg:
                                                        public override void ConfigureServices(ServiceConfigurationContext context)
                                                        {
                                                            context.Services.Configure<AbpRemoteServiceOptions>(options =>
                                                            {
                                                                options.RemoteServices.Default =
                                                                    new RemoteServiceConfiguration("http://localhost:53929/");  // 配置远程服务端口(端点)
                                                            });
                                                            
                                                            //...
                                                        }

                                    2、配置多个远程服务端口(端点)   Multiple Remote Service Endpoints

                                                        上面的示例配置了“默认”远程服务端点。

                                                        您可能对不同的服务有不同的端点（就像在微服务方法中，每个微服务都有不同的端点）。

                                                        在这种情况下，您可以将其他端点添加到配置文件中：

                                                                    {
                                                                        "RemoteServices": {
                                                                            "Default": {
                                                                                "BaseUrl": "http://localhost:53929/"
                                                                            },
                                                                            "BookStore": {
                                                                                "BaseUrl": "http://localhost:48392/"
                                                                            } 
                                                                        } 
                                                                    }
                                                                        
                                                        AddStaticHttpClientProxies方法可以获取远程服务名称的附加参数。
                                                        
                                                        示例：
                                                            context.Services.AddStaticHttpClientProxies(
                                                                typeof(BookStoreApplicationContractsModule).Assembly,
                                                                remoteServiceConfigurationName: "BookStore"
                                                            ); 
                                                            
                                                            

                                                    ★、远程服务配置提供程序   Remote Service Configuration Provider

                                                                在某些情况下，您可能需要获取特定远程服务的远程服务配置。

                                                                为此，您可以使用IRemoteServiceConfigurationProvider接口。

                                                                eg：获取“BookStore”远程服务的远程服务配置
                                                                        
                                                                        public class MyService : ITransientDependency
                                                                        {
                                                                            private readonly IRemoteServiceConfigurationProvider _remoteServiceConfigurationProvider;

                                                                            public MyService(IRemoteServiceConfigurationProvider remoteServiceConfigurationProvider)
                                                                            {
                                                                                _remoteServiceConfigurationProvider = remoteServiceConfigurationProvider; // 注入远程服务配置提供程序服务
                                                                            }

                                                                            public async Task GetRemoteServiceConfiguration()
                                                                            {
                                                                                var configuration = await _remoteServiceConfigurationProvider.GetConfigurationOrDefaultAsync("BookStore"); // 获取远程服务配置信息
                                                                                Console.WriteLine(configuration.BaseUrl);
                                                                            }
                                                                        }

                                    3、失败重试逻辑 和 Polly 集成

                                                如果要为客户端代理的失败远程HTTP调用添加重试逻辑，
                                                
                                                可以在模块类的PreConfigureServices方法中配置AbpHttpClientBuilderOptions。



                                                eg: 使用Polly库在失败时重试3次

                                                    public override void PreConfigureServices(ServiceConfigurationContext context)
                                                    {
                                                        PreConfigure<AbpHttpClientBuilderOptions>(options =>
                                                        {
                                                            options.ProxyClientBuildActions.Add((remoteServiceName, clientBuilder) =>
                                                            {
                                                                clientBuilder.AddTransientHttpErrorPolicy(policyBuilder =>
                                                                    policyBuilder.WaitAndRetryAsync(
                                                                        3,
                                                                        i => TimeSpan.FromSeconds(Math.Pow(2, i))
                                                                    )
                                                                );
                                                            });
                                                        });
                                                    }


                                                
                                                此示例使用 "Microsoft. Exents.Http.Polly" 包。
                                                
                                                您还需要导入Polly命名空间（using Polly;）才能使用WaitAndRetryAsync方法。
                     */
        </script>
    </body>
</html>